package com.example.demo.leetcode.classics150;

/**
 * ******************************************************
 *
 * @author liugh9
 * @version 1.0
 * @classname _125二进制求和
 * @description
 * @date 2023/08/18 15:49
 * <p>
 * ******************************************************
 */
public class _125二进制求和 {

    public static String addBinary(String a, String b) {
        StringBuilder asb = new StringBuilder(a);
        StringBuilder bsb = new StringBuilder(b);
        while (asb.length() > bsb.length()) {
            bsb.insert(0, 0);
        }
        while (asb.length() < bsb.length()) {
            asb.insert(0, 0);
        }
        asb.insert(0, 0);
        bsb.insert(0, 0);

        StringBuilder res = new StringBuilder();
        boolean next = false;
        for (int i = asb.length() - 1; i >= 0; i--) {
            char ac = asb.charAt(i);
            char bc = bsb.charAt(i);
            if (next) {
                if (bc == '1' && ac == '1') {
                    next = true;
                    res.insert(0, 1);
                } else if (bc == '0' && ac == '0') {
                    next = false;
                    res.insert(0, 1);
                } else {
                    next = true;
                    res.insert(0, 0);
                }
            } else {
                if (bc == '1' && ac == '1') {
                    next = true;
                    res.insert(0, 0);
                } else if (bc == '0' && ac == '0') {
                    next = false;
                    res.insert(0, 0);
                } else {
                    next = false;
                    res.insert(0, 1);
                }
            }
        }
        return res.charAt(0) == '0' ? res.substring(1) : res.toString();
    }


    public String addBinary1(String a, String b) {
        StringBuilder ans = new StringBuilder();
        int ca = 0; //是否进一位
        for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
            int sum = ca;
            sum += (i >= 0 ? a.charAt(i) - '0' : 0); // 获取字符串a对应的某一位的值 当i<0是 sum+=0（向前补0） 否则取原值 ‘1’的char类型和‘0’的char类型刚好相差为1
            sum +=( j >= 0 ? b.charAt(j) - '0' : 0);// 获取字符串a对应的某一位的值 当i<0是 sum+=0（向前补0） 否则取原值 ‘1’的char类型和‘0’的char类型刚好相差为1
            ans.append(sum % 2);  // 如果二者都为1  那么sum%2应该刚好为0 否则为1
            ca = sum / 2;   // 如果二者都为1  那么ca 应该刚好为1 否则为0
        }
        ans.append(ca == 1 ? ca : "");// 判断最后一次计算是否有进位  有则在最前面加上1 否则原样输出
        return ans.reverse().toString();
    }


    public static void main(String[] args) {
        System.out.println(addBinary("11", "1"));
    }
}
